LpNormalization ================= 对输入张量按 **实例(Instance)+ 通道(Channel)** 维度执行 Lp 归一化操作。 该算子在每个样本的每个通道内,基于 ``inner_size`` 维度计算 Lp 范数, 并结合可学习参数 ``gamma`` 与 ``beta`` 完成缩放与偏移。 .. math:: \text{norm}_{b,c} = \left( \sum_{i=1}^{N} |x_{b,c,i}|^p + \epsilon \right)^{\frac{1}{p}} y_{b,c,i} = \frac{x_{b,c,i}}{\text{norm}_{b,c}} \cdot \gamma_c + \beta_c 其中: - :math:`b` 表示 batch 维度 - :math:`c` 表示通道维度 - :math:`i` 表示 ``inner_size`` 维度 - :math:`p` 为范数阶数 - :math:`\gamma_c`、:math:`\beta_c` 为通道级缩放与偏移参数 输入: - **input** - 输入数据地址,形状为 ``[batch, channel, inner_size]``。 - **gamma** - 缩放参数地址,长度为 ``channel``。 - **beta** - 偏移参数地址,长度为 ``channel``。 - **p** - Lp 范数阶数。 - **batch** - batch 数。 - **channel** - 通道数。 - **inner_size** - 每个通道内的归一化长度。 - **epsilon** - 数值稳定因子。 - **core_mask** - 核掩码(仅适用于共享存储版本)。 输出: - **output** - LpNormalization 计算结果地址。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 ``fp32`` 类型 - MT7004 支持 ``fp16``、``fp32`` 类型 - 归一化统计量仅在单个样本、单个通道内计算 - ``p`` 为浮点数,可用于 L1、L2 等不同范数形式 **共享存储版本:** .. c:function:: void fp_lpnorm_s(float* input, float* gamma, float* beta, float* output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask) .. c:function:: void hp_lpnorm_s(half* input, half* gamma, half* beta, half* output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 18-19 // FT78NE 示例 #include #include int main(int argc, char* argv[]) { float *input = (float *)0xA0000000; // input 在 DDR 空间 float *output = (float *)0xC0000000; float *gamma = (float *)0xA1000000; float *beta = (float *)0xA2000000; int batch = 4; int channel = 64; int inner_size = 256; float p = 2.0f; float epsilon = 1e-6f; int core_mask = 0xff; fp_lpnorm_s(input, gamma, beta, output, p, batch, channel, inner_size, epsilon, core_mask); return 0; } **私有存储版本:** .. c:function:: void fp_lpnorm_p(float* input, float* gamma, float* beta, float* output, float p, int batch, int channel, int inner_size, float epsilon) .. c:function:: void hp_lpnorm_p(half* input, half* gamma, half* beta, half* output, float p, int batch, int channel, int inner_size, float epsilon) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 17-18 // FT78NE 示例 #include #include int main(int argc, char* argv[]) { float *input = (float *)0x10810000; // input 在 L2 空间 float *output = (float *)0x10820000; float *gamma = (float *)0x10830000; float *beta = (float *)0x10840000; int batch = 4; int channel = 64; int inner_size = 256; float p = 2.0f; float epsilon = 1e-6f; fp_lpnorm_p(input, gamma, beta, output, p, batch, channel, inner_size, epsilon); return 0; }